package br.com.view;

import java.util.Map;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import br.com.beans.CPUList;
import br.com.beans.NodeList;

public class ArvoreCPU extends StackPane {

	private TreeView<String> arvore;
	private TreeItem<String> ramoGeral;
	private TreeItem<String> ramoCPU;
	private TreeItem<String> ramoNode;
	private static StringProperty textoCPUselecionada = new SimpleStringProperty("");
	private static StringProperty textoNodeSelecionado = new SimpleStringProperty("");
	private static CPUList cpu;

	public ArvoreCPU() {

		if (cpu == null) {
			cpu = new CPUList();

			// Usando uma classe auxiliar para conseguir os nomes das CPU's do
			// projeto. A interface Map retorna uma par de {chave, valor}, onde
			// a
			// chave é a idCPU e o valor é o modelo da CPU
			Map<String, String> listaCPU = cpu.getListaModeloCpus();

			// Criando o ramo geral na árvore principal
			ramoGeral = new TreeItem<String>("GERAL");
			ramoGeral.setExpanded(true);

			// Criando os sub-ramos (nível 1) com o nome das cpus adquiridas
			Image iconCPU;
			for (String nomeCPU : listaCPU.keySet()) {

				// Inserindo os ícones de acordo com o modelo de CPU
				if (listaCPU.get(nomeCPU).contains("PLC5")) {
					iconCPU = new Image("img/plc5.png");
				}
				else if (listaCPU.get(nomeCPU).contains("SLC")) {
					iconCPU = new Image("img/slc.jpg");
				}
				else if (listaCPU.get(nomeCPU).contains("CLX")) {
					iconCPU = new Image("img/clx.png");
				}
				else if (listaCPU.get(nomeCPU).contains("CPU")) {
					iconCPU = new Image("img/omron.jpg");
				}
				else {
					iconCPU = new Image("img/question.png");
				}

				ImageView ivIconeCPU = new ImageView(iconCPU);
				ivIconeCPU.setFitHeight(30);
				ivIconeCPU.setFitWidth(30);

				ramoCPU = new TreeItem<String>();
				ramoCPU.setValue(nomeCPU);
				ramoCPU.setGraphic(ivIconeCPU);
				ramoCPU.setExpanded(false);
				ramoGeral.getChildren().add(ramoCPU);

				// Criando os sub-ramos (nível 2) com o nome dos nós de cada CPU

				// O Map retorna um par {idNode, Tipo}
				Map<String, String> nomeNode = new NodeList(nomeCPU).getListaModeloNode();
				Image iconNode;
				ImageView ivIconeNode;
				for (String numeroNode : nomeNode.keySet()) {

					if (nomeNode.get(numeroNode).contains("CNBR")) {

						iconNode = new Image("img/cnbr.png");
						ivIconeNode = new ImageView(iconNode);
						ivIconeNode.setFitHeight(25);
						ivIconeNode.setFitWidth(8);

					}
					else if (nomeNode.get(numeroNode).contains("ACNR")) {

						iconNode = new Image("img/acnr.png");
						ivIconeNode = new ImageView(iconNode);
						ivIconeNode.setFitHeight(20);
						ivIconeNode.setFitWidth(20);

					}
					else {

						iconNode = new Image("img/question.png");
						ivIconeNode = new ImageView(iconNode);
						ivIconeNode.setFitHeight(25);
						ivIconeNode.setFitWidth(8);
					}

					ramoNode = new TreeItem<String>("Nó "
					               + numeroNode, ivIconeNode);
					ramoNode.setValue(numeroNode);
					ramoNode.setExpanded(true);
					ramoCPU.getChildren().add(ramoNode);

				}
			}
			System.out
			               .println("-----------------------------------------------------------");
		}

		// Criando a árvore, que aloca os ramos criados
		arvore = new TreeView<String>(ramoGeral);

		// Escolhendo o tipo de seleção para a árvore
		arvore.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

		// Adicionando um listenerpara a linha
		arvore.getSelectionModel().selectedItemProperty()
		               .addListener(new ChangeListener<TreeItem<String>>() {

			               @Override
			               public
			                              void
			                              changed(
			                                             ObservableValue<? extends TreeItem<String>> observable,
			                                             TreeItem<String> oldValue,
			                                             TreeItem<String> newValue) {

				               // Quando um item da lista é selecionado, o texto dele
				               // é passado para a variável 'ouvinte'

				               // Se o item for o top, não terá pai, então a
				               // propriedade
				               // referente a cpu não existirá
				               if (newValue.getParent() != null) {
					               // Se o item selecionado tiver na primeira
					               // identação, ele é a própria cpu
					               if (TreeView.getNodeLevel(newValue) == 1) {
						               textoCPUselecionada.set(newValue.getValue());
						               textoNodeSelecionado.set("");
						               System.out.println("lv1 >> CPU:"
						                              + newValue.getValue());
						               // Se o item selecionado tiver na segunda
						               // identação, ele é o node, então a cpu é seu
						               // parent
					               }
					               else if (TreeView.getNodeLevel(newValue) == 2) {
						               textoCPUselecionada.set(newValue.getParent().getValue());
						               textoNodeSelecionado.set(newValue.getValue());
						               System.out.println("lv2 >> CPU "
						                              + newValue.getParent().getValue()
						                              + " >> Node  "
						                              + newValue.getValue());
						               // Se o item selecionado for o top, não terá
						               // pai, então a propriedade referente a cpu não
						               // existirá
					               }
					               else {
						               textoCPUselecionada.set("");
					               }
				               }
			               }
		               });

		this.getChildren().add(arvore);

	}

	public String getTextoCPUselecionada() {

		return textoCPUselecionada.get();
	}

	public StringProperty textoCPUselecionadaProperty() {
		return textoCPUselecionada;
	}

	public String getTextoNodeSelecionado() {

		return textoNodeSelecionado.get();
	}

	public StringProperty textoNodeSelecionadoProperty() {
		return textoNodeSelecionado;
	}

	public TreeView<String> getArvore() {
		return arvore;
	}

	public CPUList getCpu() {
		return cpu;
	}

}
